<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>

<script type="text/javascript">

    //splice() 语法一
    // var arr = [2, 63, 48, 5, 4, 75]
    // res = arr.splice(1, 2)
    // console.log(arr);
    // console.log(res);
    // //******************************
    // //splice() 语法二
    // var arr = [2, 63, 48, 5, 4, 75]
    // res = arr.splice(1, 1, 99999, 88888)
    // console.log(arr);
    // console.log(res);

    //concat
    // var arr = [10, 20, 10, 30, 40, 50, 60]
    // res = arr.concat(20, "小敏", 50)
    // console.log(arr)
    // console.log(res);

    //indexOf 语法一
    // var arr = [10, 20, 10, 30, 40, 50, 60]
    // res = arr.indexOf(10)
    // console.log(arr)
    // console.log(res);
    // //*************************************
    // //indexOf  语法二
    // var arr = [10, 20, 10, 30, 40, 50, 60]
    // res = arr.indexOf(10, 1)
    // console.log(arr)
    // console.log(res);

    // map
    // var arr = [1, 2, 3, 4, 5];
    // var res = arr.map(function(item) {
    //     return item * 2;
    // })
    // console.log(res);

    // 过滤
    // var arr = [1, 2, 3, 4, 5];
    // var res = arr.filter(function (item) {
    //     return item > 2
    // })
    // console.log(res);

    // reduce 叠加后的效果
    // var arr = [1, 2, 3, 4, 5];
    // var res = arr.reduce(function (prev, item) {
    //     return prev *= item
    // }, 1)

    // console.log(res);


    // 数组拍平
    const arr = [1, 2, 3, 4, [1, 2, 3, [1, 2, 3, [1, 2, 3]]], 5, "string", { name: "嗨害嗨同学" }];
    // concat + 递归
    function flat(arr) {
        // let arrResult = [];
        // arr.forEach(item => {
        //     if (Array.isArray(item)) {
        //         arrResult = arrResult.concat(arguments.callee(item));   // 递归
        //         // 或者用扩展运算符
        //         // arrResult.push(...arguments.callee(item));
        //     } else {
        //         arrResult.push(item);
        //     }
        // });
        // return arrResult;
    }
    // console.log(flat(arr))
// [1, 2, 3, 4, 1, 2, 3, 1, 2, 3, 1, 2, 3, 5, "string", { name: "弹铁蛋同学" }];

    // concat + 递归
    // function flat(arr) {
    //     let res = [];
    //     arr.forEach(item => {
    //         if (Array.isArray(item)) {
    //             res = res.concat(arguments.callee(item));
    //             // res = res.concat(flat(item))
    //         } else {
    //             res.push(item);
    //         }
    //     });
    //     return res;
    // }

    // 使用reduce
    // function flat(arr) {
    //     const res = arr.reduce((prev, cur) => {
    //         return prev.concat(Array.isArray(cur) ? flat(cur) : cur);
    //     }, [])
    //     return res;
    // }



    // 按层数展开
    function flatByLevel(arr, num) {
        return num > 0
        ? arr.reduce((prev, cur) => {
            return prev.concat(Array.isArray(cur) ? flatByLevel(cur, num - 1) : cur);
        }, [])
        : arr.slice();
    }

    // function flatByLevel(arr, num) {
    //     return num > 0
    //     ? arr.reduce((prev, cur) => {
    //         return prev.concat(Array.isArray(cur) ? flatByLevel(cur, num - 1) : cur);
    //     }, [])
    //     : arr.slice();
    // }
    
    // console.log(flat(arr))
    console.log(flatByLevel(arr, 2));


    // reduce方法
    function flat(arr) {
        const res = arr.reduce((prev, cur) => {
            return prev.concat(Array.isArray(cur) ? flat(cur) : cur);
        }, []);
        return res;
    }

    // 按层数拍平
    function flagByLevel(arr, num) {
        return num > 0
        ? arr.reduce((prev, cur) => {
            return prev.concat(Array.isArray(cur) ? flagByLevel(cur, num - 1) : cur)
        }, [])
        : arr.slice();
    }

    // 递归拍平
    function flatByCircle(arr) {
        let res = [];
        arr.forEach((item, index) => {
            if (Array.isArray(item)) {
                res.push(...arguments.callee(item));
            } else {
                res.push(item);
            }
        })
        return res;
    }


</script>

</html>